package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.ui.Model;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.AfiliacionDao;
import com.pe.pgn.clubpgn.dao.CanjeDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmSerieCanje;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Frank
 * */

@Repository("canjeDao")
public class CanjeDaoImpl extends GenericDaoHibernate<ClpbDocumentoMovArticulo, Long> implements CanjeDao{
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public CanjeDaoImpl() {
		super(ClpbDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> obtenerListaCanje() {

		String strFechaMax = obtenerMaximaFechaDocumentoCanje();		
		String strFechaDoc = "to_char(" +
		"dma.da_fecha_documento ,  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select * from (");
		
		query.append(" select ");
		query.append("  dma.id ");
		query.append(" ,dma.nu_serie 		 as nuSerie ");
		query.append(" ,dma.nu_documento 	 as nuDocumento ");
		query.append(" ,dma.st_indicador_tipo_documento as stIndicatorTipoDoc ");
		query.append(" ,almacen.de_almacen 	 as deAlmacen   ");
		query.append(" ,estacion.de_estacion as deEstacion  ");
		query.append(" ,articulo.de_articulo as dePremio    ");
		query.append(" ,articulo.st_no_maneja_stock                    as stNoManejaStock ");
		query.append(" ,articulo.st_maneja_stock_punto_canje           as stManejaStockPuntoCanje ");
		query.append(" ,articulo.st_maneja_stock_alm_principal         as stManejaStockAlmPrincipal ");
		query.append(" ,articulo.st_instantaneo_normal                 as stInstantaneoNormal ");
		query.append(" ,articulo.st_instantaneo_vale                   as stInstantaneoVale ");
		query.append(" ,catalogo.de_catalogo as deCatalogo  ");
		query.append(" ,"+strFechaDoc+" as daFechaDocumento ");
		query.append(" ,dma.co_cod_tarjeta_persona_canje as codTarjeta ");
		query.append(" ,dma.st_documento_mov_articulo as stDocumentoMovArt ");
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" left join clpd_documento_mov_articulo dtl ");
		query.append(" 		on dtl.co_documento_mov_articulo = dma.id ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = dma.co_cliente_persona ");
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.id = dma.co_almacen ");
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.id = almacen.co_estacion ");
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id = dtl.co_articulo ");
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = dma.co_catalogo ");
		
		query.append(" where dma.st_documento_mov_articulo = ").append("'"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and (dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
		query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"')");
		
		if(StringUtils.isNotBlank(strFechaMax)){
			query.append("and "+strFechaDoc+" = '"+strFechaMax+"'");
		}
		
		query.append(" group by ");
		query.append(" 	  dma.id ");
		query.append(" 	 ,dma.nu_serie ");
		query.append(" 	 ,dma.nu_documento ");
		query.append("   ,dma.st_indicador_tipo_documento ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append("   ,articulo.st_no_maneja_stock ");
		query.append("   ,articulo.st_maneja_stock_punto_canje ");
		query.append("   ,articulo.st_maneja_stock_alm_principal ");
		query.append("   ,articulo.st_instantaneo_normal  ");               
		query.append("   ,articulo.st_instantaneo_vale "); 
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,dma.da_fecha_documento ");
		query.append(" 	 ,dma.co_cod_tarjeta_persona_canje ");
		query.append(" 	 ,dma.st_documento_mov_articulo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		
		query.append(" order by dma.id desc ");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		System.out.println("*** CanjeDaoImpl.obtenerListaCanje() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}
	
	@SuppressWarnings("unchecked")
	private String obtenerMaximaFechaDocumentoCanje(){
		
		String strFechaDoc = "to_char(max(" +
		"dma.da_fecha_documento), " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" "+strFechaDoc+" as daFechaDocumento");
		query.append(" from clpb_documento_mov_articulo dma ");
		
		query.append(" where dma.st_documento_mov_articulo = ").append("'"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and (dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
		query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"')");
		
		System.out.println("*** Obteniendo maxima fecha para CANJE: "+query.toString());
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("daFechaDocumento"));
		}
		
		return "";
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaCanje(String codeEstacion,
			String codeTarjeta, String daInicioDoc, String daFinDoc, String coCatalogo,
			String nuSerie, String nuDocumento, String deCliente, String codePremio, String stCanje, String stTipoDoc) {

		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daInicioDoc);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daFinDoc);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	daInicioDoc = "";
        	daFinDoc 	= "";
        }
        
		String codeAlmacen = "";
		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		if (StringUtils.isNotBlank(codeEstacion) && !"-1".equals(codeEstacion))			
		codeAlmacen = obtenerCodigoAlmacenPorEstacion(codeEstacion);
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append("  dma.id ");
		query.append(" ,dma.nu_serie 		 as nuSerie ");
		query.append(" ,dma.nu_documento 	 as nuDocumento ");
		query.append(" ,dma.st_indicador_tipo_documento as stIndicatorTipoDoc ");
		query.append(" ,almacen.de_almacen 	 as deAlmacen   ");
		query.append(" ,estacion.de_estacion as deEstacion  ");		
		query.append(" ,articulo.de_articulo as dePremio    ");
		query.append(" ,articulo.st_no_maneja_stock                    as stNoManejaStock ");
		query.append(" ,articulo.st_maneja_stock_punto_canje           as stManejaStockPuntoCanje ");
		query.append(" ,articulo.st_maneja_stock_alm_principal         as stManejaStockAlmPrincipal ");
		query.append(" ,articulo.st_instantaneo_normal                 as stInstantaneoNormal ");
		query.append(" ,articulo.st_instantaneo_vale                   as stInstantaneoVale ");
		query.append(" ,catalogo.de_catalogo as deCatalogo  ");
		query.append(" ,"+strFechaDoc+" as daFechaDocumento ");
		query.append(" ,dma.co_cod_tarjeta_persona_canje as codTarjeta ");
		query.append(" ,dma.st_documento_mov_articulo as stDocumentoMovArt ");		
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" left join clpd_documento_mov_articulo dtl ");
		query.append(" 		on dtl.co_documento_mov_articulo = dma.id ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = dma.co_cliente_persona ");
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.id = dma.co_almacen ");
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.id = almacen.co_estacion ");
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id = dtl.co_articulo ");
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = dma.co_catalogo ");
		query.append(" left join clpr_premio_catalogo premcat ");
		query.append(" 		on  premcat.id = dtl.co_premio ");
		query.append(" 		and premcat.co_premio = dtl.co_articulo ");
		
		query.append(" where 1 = 1 ");
		
		if (StringUtils.isNotBlank(codeAlmacen) && !"null".equals(codeAlmacen))
		query.append(" and dma.co_almacen = ").append(codeAlmacen);
		
		if (StringUtils.isNotBlank(codeTarjeta))
		query.append(" and dma.co_cod_tarjeta_persona_canje like ").append("'%"+codeTarjeta+"%'");
		
		if (StringUtils.isNotBlank(daInicioDoc) && StringUtils.isNotBlank(daFinDoc)){
			query.append(" and (dma.da_fecha_documento >= to_date('"+daInicioDoc+"'," +
			"'"+CLPConstantes.DATE_PATTERN+"') and dma.da_fecha_documento <= to_date('"+daFinDoc+"','"+CLPConstantes.DATE_PATTERN+"'))");
		}
		
		if (StringUtils.isNotBlank(coCatalogo) && !"-1".equals(coCatalogo)){
			query.append(" and dma.co_catalogo = ").append(coCatalogo);
			query.append(" and (to_date(to_char(catalogo.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
			query.append(" and to_date(to_char(catalogo.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		}
		
		if (StringUtils.isNotBlank(nuSerie) && !"-1".equals(nuSerie))
		query.append(" and dma.nu_serie = ").append("'"+nuSerie+"'");
		
		if (StringUtils.isNotBlank(nuDocumento))
		query.append(" and dma.nu_documento like ").append("'%"+nuDocumento+"%'");
		
		if (StringUtils.isNotBlank(deCliente))
		query.append(" and upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) like upper('%"+deCliente.trim()+"%') ");
		
		if (StringUtils.isNotBlank(codePremio))
		query.append(" and upper(premcat.co_codigo_premio) like upper('%"+codePremio.trim()+"%') ");
		
		if (StringUtils.isNotBlank(stCanje) && !"-1".equals(stCanje)){
			query.append(" and dma.st_documento_mov_articulo = ").append("'"+stCanje+"'");
		}else{
			query.append(" and dma.st_documento_mov_articulo = ").append("'"+CLPConstantes.ST_VERDADERO+"'");
		}
		
		if(CLPConstantes.ST_DOCUMENTO_RESERVA.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"'");
		}else if(CLPConstantes.ST_DOCUMENTO_CANJE.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
		//}else if(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE.equals(stTipoDoc)){
		//	query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE+"'");
			
		}else{
			query.append(" and (dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
			query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"' )");
			//query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE+"')");
		}
		
		query.append(" group by ");
		query.append(" 	  dma.id ");
		query.append(" 	 ,dma.nu_serie ");
		query.append(" 	 ,dma.nu_documento ");
		query.append("   ,dma.st_indicador_tipo_documento ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append("   ,articulo.st_no_maneja_stock ");
		query.append("   ,articulo.st_maneja_stock_punto_canje ");
		query.append("   ,articulo.st_maneja_stock_alm_principal ");
		query.append("   ,articulo.st_instantaneo_normal  ");               
		query.append("   ,articulo.st_instantaneo_vale "); 
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,dma.da_fecha_documento ");
		query.append(" 	 ,dma.co_cod_tarjeta_persona_canje ");
		query.append(" 	 ,dma.st_documento_mov_articulo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		query.append(" order by dma.id desc ");
		
		System.out.println("*** CanjeDaoImpl.busquedaCanje() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	
	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaCanjeInstantaneo(String codeEstacion,
			String codeTarjeta, String daInicioDoc, String daFinDoc, String coCatalogo,
			 String nuDocumento, String deCliente, String codePremio, String stCanje, String stTipoDoc) {

		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daInicioDoc);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daFinDoc);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	daInicioDoc = "";
        	daFinDoc 	= "";
        }
        
		String codeAlmacen = "";

		
		if (StringUtils.isNotBlank(codeEstacion) && !"-1".equals(codeEstacion))			
		codeAlmacen = obtenerCodigoAlmacenPorEstacion(codeEstacion);
		
		StringBuffer query = new StringBuffer();

		
		query.append(" select ");
		query.append("  solicanjeins.id		 			 						as id ");
		query.append(" ,solicanjeins.co_code_canje 		 						as codCanje ");
		query.append(" ,almacen.de_almacen 	 			 						as deAlmacen ");
		query.append(" ,estacion.de_estacion			 						as deEstacion ");	
		query.append(" ,articulo.de_articulo 									as dePremio   ");
		query.append(" ,articulo.st_no_maneja_stock                 			as stNoManejaStock ");
		query.append(" ,articulo.st_maneja_stock_punto_canje        			as stManejaStockPuntoCanje ");
		query.append(" ,articulo.st_maneja_stock_alm_principal      			as stManejaStockAlmPrincipal ");
		query.append(" ,articulo.st_instantaneo_normal              			as stInstantaneoNormal ");
		query.append(" ,articulo.st_instantaneo_vale                			as stInstantaneoVale ");
		query.append(" ,catalogo.de_catalogo 									as deCatalogo  ");
		query.append(" ,solicanjeins.co_code_tarjeta_persona                    as codtarjeta ");
		query.append(" ,to_char(solicanjeins.da_fecha_creacion,'dd/MM/yyyy')   	as daFechaCanje ");
		query.append(" ,'CI'                                                   	as stIndicatorTipoDoc");
		query.append(" ,premio.co_premio_instantaneo as codPremioinst ");
		query.append(" ,solicanjeins.st_solic_canje_instantaneo as stSolicitudCanje ");	
		query.append(" ,decode(solicanjeins.co_proceso_ok,'1','Y','N')      	as stProcesoOK  ");	
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpm_solic_canje_instantaneo solicanjeins ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = solicanjeins.co_cliente_persona");
		
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.co_codigo_cofide= solicanjeins.co_code_estacion ");
		
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.co_estacion = estacion.id ");
		
		query.append(" left join clpr_premio_catalogo premio ");
		query.append(" 		on premio.id=solicanjeins.co_premio ");
		
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id=premio.co_premio ");
		
		
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = premio.co_catalogo");
	
		
		query.append(" where solicanjeins.st_solic_canje_instantaneo='Y' and 1 = 1 ");
		
		if (StringUtils.isNotBlank(codeAlmacen) && !"null".equals(codeAlmacen))
		query.append(" and almacen.id = ").append(codeAlmacen);
		
		if (StringUtils.isNotBlank(codeTarjeta))
		query.append(" and solicanjeins.co_code_tarjeta_persona like ").append("'%"+codeTarjeta+"%'");
		
		if (StringUtils.isNotBlank(daInicioDoc) && StringUtils.isNotBlank(daFinDoc)){
			query.append(" and (solicanjeins.da_fecha_creacion >= to_date('"+daInicioDoc+"'," +
			"'"+CLPConstantes.DATE_PATTERN+"') and solicanjeins.da_fecha_creacion <= to_date('"+daFinDoc+"','"+CLPConstantes.DATE_PATTERN+"'))");
		}
		
		if (StringUtils.isNotBlank(coCatalogo) && !"-1".equals(coCatalogo)){
			query.append(" and catalogo.id = ").append(coCatalogo);
			query.append(" and (to_date(to_char(catalogo.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
			query.append(" and to_date(to_char(catalogo.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		}
		
		
		if (StringUtils.isNotBlank(nuDocumento))
		query.append(" and dma.nu_documento like ").append("'%"+nuDocumento+"%'");
		
		if (StringUtils.isNotBlank(deCliente))
		query.append(" and upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) like upper('%"+deCliente.trim()+"%') ");
		
		if (StringUtils.isNotBlank(codePremio))
		query.append(" and upper(premio.co_codigo_premio) like upper('%"+codePremio.trim()+"%') ");
		
		if (StringUtils.isNotBlank(stCanje) && !"-1".equals(stCanje)){
			if(stCanje.equals(CLPConstantes.ST_VERDADERO)){
				stCanje="1";
			}else{
				stCanje="0";
			}
			query.append(" and solicanjeins.co_proceso_ok = ").append("'"+stCanje+"'");
		}else{
			query.append(" and solicanjeins.st_solic_canje_instantaneo = ").append("'"+CLPConstantes.ST_VERDADERO+"'");
		}
		
		
			
		query.append(" group by ");
		query.append(" 	  solicanjeins.id  ");
		query.append(" 	 ,solicanjeins.co_code_canje ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append("   ,articulo.st_no_maneja_stock ");
		query.append("   ,articulo.st_maneja_stock_punto_canje ");
		query.append("   ,articulo.st_maneja_stock_alm_principal ");
		query.append("   ,articulo.st_instantaneo_normal  ");               
		query.append("   ,articulo.st_instantaneo_vale "); 
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,solicanjeins.da_fecha_creacion ");
		query.append(" 	 ,solicanjeins.co_code_tarjeta_persona ");
		query.append(" 	 ,solicanjeins.co_premio  ");
		query.append(" 	 ,solicanjeins.co_proceso_ok ");
		query.append(" 	 ,premio.co_premio_instantaneo ");
		query.append(" 	 ,solicanjeins.st_solic_canje_instantaneo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		query.append(" order by solicanjeins.id desc ");
		
		System.out.println("*** CanjeDaoImpl.busquedaCanjeInst() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}
	
	
	
	
	
	
	
	@SuppressWarnings("unchecked")
	private String obtenerCodigoAlmacenPorEstacion(String codeEstacion) {

		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append(" from clpb_almacen ");
		query.append(" where co_estacion = ").append(codeEstacion);
		query.append(" and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("id"));
		}else{
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<ClpmSerieCanje> obtenerListaSerieCanje() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	de_serie as deSerie ");
		query.append(" from clpm_serie_canje ");
		query.append(" where st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" order by de_serie asc ");
		
		return findListOfBeans(query.toString(), null, ClpmSerieCanje.class);
	}

	@SuppressWarnings("unchecked")
	public BNDocumentoMovArticulo obtenerCanjePremio(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" dma.id as id, ");
		query.append(" cp.id as coCliente , ");
		query.append(" cp.de_nombre||' '|| cp.de_ape_paterno||' '||cp.de_ape_materno as deCliente, ");
		query.append(" to_char(cast(dma.da_fecha_documento  as date), '"+CLPConstantes.DATE_PATTERN+"') as daFechaDocumento, ");
		query.append(" cptos.va_puntos_actuales			as dePuntosAcumulados,  ");	
		query.append(" dma.co_almacen 					as coAlmacen, ");
		query.append(" alm.de_almacen 					as deAlmacen, ");
		query.append(" dma.st_documento_mov_articulo	as stDocumentoMovArt, ");
		query.append(" dma.de_observaciones				as deObservacion, ");
		query.append(" dma.co_cod_tarjeta_persona_canje	as codTarjeta, ");
		query.append(" dma.nu_serie						as nuSerie, ");
		query.append(" dma.nu_documento					as nuDocumento, ");
		query.append(" dma.va_cantidad					as vaCantidad, ");
		query.append(" dma.va_puntos_premio				as vaPuntosPremio, ");
		query.append(" dma.va_puntos_totales			as vaPuntosTotales, ");
		query.append(" dma.va_precio_premio				as vaPrecioPremio, ");
		query.append(" dma.va_precio_total				as vaPrecioTotal, ");
		query.append(" dma.st_direccion					as stDireccion, ");
		query.append(" dma.st_almacen_principal			as stAlmacenPrincipal, ");
		query.append(" dma.st_punto_canje				as stPuntoCanje, ");
		query.append(" dma.de_jr_av_ca					as deJrAvCa, ");
		query.append(" dma.de_direccion					as deDireccion, ");
		query.append(" dma.de_numero					as deNumero, ");
		query.append(" dma.de_mz_lote					as deMzLote, ");
		query.append(" dma.de_dpto_piso_int				as deDptoPisoInt, ");
		query.append(" dma.de_urb_ind_res_un_vec		as deUrbIndResUnVec, ");
		query.append(" dma.de_sec_etapa_zona			as deSecEtapaZona, ");
		query.append(" ub.co_departamento				as coDepartamento, ");
		query.append(" ub.de_departamento				as deDepartamento, ");
		query.append(" ub.co_distrito					as coDistrito, ");
		query.append(" ub.de_distrito					as deDistrito, ");
		query.append(" ub.co_provincia					as coProvincia, ");
		query.append(" ub.de_provincia 					as deProvincia, ");
		query.append(" cpc.co_codigo_premio 			as coCodigoPremio, ");
		query.append(" art.de_articulo 	 				as deCodigoPremio, ");
		query.append(" art.st_maneja_serie				as stManejaSerie, ");
		query.append(" dma.co_articulo		 			as coArticulo, 	");
		query.append(" dma.co_premio					as coPremio, 	");
		query.append(" dma.st_indicador_tipo_documento	as stOperacion, 	");
		query.append(" dma.nu_doc_entrega_reserva		as nuDocEntregaReserva, 	");
		query.append(" dma.st_documento_mov_articulo 	as stCanje ");
		
		query.append(" from clpb_documento_mov_articulo dma  ");
		query.append(" inner join clpb_almacen alm  ");
		query.append(" 		on alm.id = dma.co_almacen ");
		query.append(" inner join clpb_tarjeta_persona trj  ");
		query.append(" 		on trj.co_codigo_tarjeta_persona = dma.co_cod_tarjeta_persona_canje ");
		query.append(" inner join clpb_cliente_persona cp  ");
		query.append(" 		on cp.id = trj.co_cliente_persona ");
		query.append(" left join clpm_puntos_periodo_cliente cptos ");
		query.append(" 		on cptos.co_cliente_persona = trj.co_cliente_persona ");
		query.append(" left join clpm_ubigeo ub  ");
		query.append(" 		on ub.id = dma.co_ubigeo ");
		query.append(" left join clpr_premio_catalogo cpc  		");
		query.append(" 		on  cpc.id = dma.co_premio");
		query.append(" 		and cpc.co_premio = dma.co_articulo");
		query.append(" left join clpd_articulo art ");
		query.append(" 		on  art.id = dma.co_articulo");
//		query.append(" inner join clpr_periodo_acumulacion cpa ");
//		query.append(" 		on  cpa.id =cptos.co_periodo_acumulacion ");
		query.append(" where dma.id = ").append(id);
//		query.append(" 		and cpa.da_fecha_inicio<=sysdate ");
//		query.append(" 		and cpa.da_fecha_vencimiento_puntos>=sysdate ");
//		query.append(" 		and cpa.da_fecha_inicio<=cptos.da_fecha_creacion  ");
//		query.append(" 		and cpa.da_fecha_vencimiento_puntos>= cptos.da_fecha_creacion ");
		List<BNDocumentoMovArticulo> list = findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
		if(!list.isEmpty()){
			
			BNDocumentoMovArticulo bndocumento =  (BNDocumentoMovArticulo)list.get(0);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
			query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
			query.append(" 		dta.co_articulo		 as coArticulo, 	");
			query.append(" 		dta.co_premio		 as coPremio, 		");
			query.append(" 		dta.co_serie 		 as coSerie			");
			query.append(" from clpd_documento_mov_articulo dta  		");
			query.append(" inner join clpr_premio_catalogo cpc  		");
			query.append(" 		on  cpc.id = dta.co_premio");
			query.append(" 		and cpc.co_premio = dta.co_articulo");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on  art.id = dta.co_articulo");
			query.append(" where dta.co_serie is not null ");
			query.append(" 	and dta.co_documento_mov_articulo = ").append(id);
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("*************** obteniendo DETALLE: "+query.toString());
			List<BNDocumentoDetalle> listDetalle = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);	
			
			if(!listDetalle.isEmpty()){				
				bndocumento.setDocumentoDetalle(listDetalle);				
			}
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" sum(doc.va_cantidad) as cantdevuelta,doc2.va_cantidad as cantidadgeneral ");
			query.append(" from clpb_documento_mov_articulo doc ");
			query.append(" inner join clpb_documento_mov_articulo doc2 ");
			query.append(" on doc2.id = doc.co_documento_mov_canje ");
			query.append(" where doc.co_documento_mov_canje = ").append(bndocumento.getId());
			query.append(" and doc.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" group by doc2.va_cantidad ");
			
			List listMap = jdbcTemplate.queryForList(query.toString());
			if(!listMap.isEmpty()){
				Map map = (HashMap)listMap.get(0);
				Long vaCantDevuelta = new Long(map.get("cantdevuelta").toString());
				bndocumento.setVaCantDevuelta(vaCantDevuelta);
			}else{
				bndocumento.setVaCantDevuelta(new Long(0));
			}
			
			return bndocumento;
		}
		
		return new BNDocumentoMovArticulo();
	}

	@SuppressWarnings("unchecked")
	public List<BNAlmacen> obtenerListaAlmacen() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	 id, co_estacion as coEstacion, ");
		query.append(" 	 de_almacen as deAlmacen ");
		query.append(" from clpb_almacen ");
		query.append(" where st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		System.out.println("Obtener Lista Almacen"+query.toString());
		return findListOfBeans(query.toString(), null, BNAlmacen.class);
	}

	@SuppressWarnings("unchecked")
	public BNAlmacen obtenerAlmacenPorEstacion(Long idEstacion) {
		
		try{

			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	 id ");
			query.append(" 	,de_almacen as deAlmacen ");
			query.append(" from clpb_almacen ");
			query.append(" where st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and co_estacion = ").append(idEstacion);
			
			List list = findListOfBeans(query.toString(), null, BNAlmacen.class);
			if(!list.isEmpty()){
				return (BNAlmacen)list.get(0);
			}
		
		}catch(Exception e){
			System.out.println("Excepcion MESSAGE: "+e.getMessage());
			System.out.println("Excepcion CAUSA: "+e.getCause());
		}
		
		return null;
	}

	@SuppressWarnings("unchecked")
	public BNClientesPersona obtenerDatosClientePorTarjeta(String codeTarjeta) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" cp.id, ");
		query.append(" cp.de_nombre||' '|| cp.de_ape_paterno||' '||cp.de_ape_materno as deNombre, ");
		query.append(" cptos.va_puntos_actuales as dePuntosAcumulados,  ");
		query.append(" tp.co_cliente_persona as coClientePersona,  ");
		query.append(" cp.dpto_direccion as dptoDireccion,  ");
		query.append(" cp.jr_direccion as jrDireccion,  ");
		query.append(" cp.mz_direccion as mzDireccion,  ");
		query.append(" cp.nombre_direccion as nombreDireccion,  ");
		query.append(" cp.nombre_urb_direccion as nombreUrbDireccion,  ");
		query.append(" cp.numero_direccion as numeroDireccion,  ");
		query.append(" cp.sec_direccion as secDireccion,  ");
		query.append(" cp.co_ubigeo as coUbigeo,  ");
		query.append(" ubg.co_departamento as coDepartamento,  ");
		query.append(" ubg.co_provincia as coProvincia,  ");
		query.append(" ubg.co_distrito as coDistrito   ");
		
		query.append(" from clpb_tarjeta_persona tp ");
		query.append(" inner join clpb_cliente_persona cp ");
		query.append(" 		on cp.id = tp.co_cliente_persona ");
		query.append(" left join clpm_puntos_periodo_cliente cptos ");
		query.append(" 		on cptos.co_cliente_persona = tp.co_cliente_persona ");		
		query.append(" left join clpm_ubigeo ubg ");
		query.append(" 		on ubg.id = cp.co_ubigeo ");
		query.append(" inner join clpr_periodo_acumulacion cpa ");
		query.append(" 		on  cpa.id =cptos.co_periodo_acumulacion ");
		query.append(" where trim(tp.co_codigo_tarjeta_persona) = '").append(codeTarjeta.trim()).append("'");
		query.append(" 		and cpa.da_fecha_inicio<=sysdate ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>=sysdate ");
		query.append(" 		and cpa.da_fecha_inicio<=cptos.da_fecha_creacion  ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>= cptos.da_fecha_creacion ");
		query.append(" 		and cp.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");

		

		
		System.out.println("Obtener Datos Cliente x Tarjeta:"+query.toString());
		List list = findListOfBeans(query.toString(), null, BNClientesPersona.class);
		if(list != null && !list.isEmpty()){
			return (BNClientesPersona)list.get(0);
		}
		
		return new BNClientesPersona();
	}

	@SuppressWarnings("unchecked")
	public BNArticulo obtenerDatosPremioPorCodigo(String codePremio,String coAlmacen) {
	
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		pc.va_stock_catalogo		as vaStockCatalogoPremioCat, ");
		query.append(" 		pc.va_stock_catalogo_espejo	as vaStockCatalogoEspejoPremioCat, ");		
		query.append(" 		pc.va_canjes_limite			as vaCanjesLimite, ");
		query.append(" 		pc.va_canjes_limite_espejo	as vaCanjesLimiteEspejo, ");
		query.append(" 		pa.va_stock_actual			as vaStockActual, ");
		query.append(" 		pa.va_stock_disponible		as vaStockDisponible, ");
		query.append(" 		pc.id						as coPremio, ");
		query.append(" 		pa.id						as coArticulo, ");
		query.append(" 		pa.de_articulo				as deArticulo, ");
		query.append(" 		pc.co_catalogo				as coCatalogo, ");
		query.append(" 		cat.de_catalogo				as deCatalogo, ");
		query.append(" 		pc.co_codigo_premio			as coCodigoPremio, ");
		query.append(" 		pa.co_codigo_articulo		as coCodigoArticulo, ");
		query.append(" 		ca.de_categoria				as deCategoria, ");
		query.append(" 		dm.de_unidad_medida			as deUnidadMedida, ");
		query.append(" 		pc.va_puntos_requeridos		as vaPuntosRequeridos, ");
		query.append(" 		pc.va_monto_requerido		as vaMontoRequerido, ");
		query.append(" 		pa.st_maneja_serie			as stManejaSerie, ");
		query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
		query.append(" 		sac.id								as coStockAlmacenCatalogo, ");
		query.append(" 		sac.va_cantidad						as vaStockCatalogo, ");
		query.append(" 		sac.va_stock_catalogo				as vaStockCatalogoPremio, ");
		query.append(" 		sac.va_stock_catalogo_espejo		as vaStockCatalogoEspejoPremio, ");
		query.append(" 		sac.va_comprometido					as vaComprometido, ");
		query.append(" 		sac.co_almacen						as coAlmacen, ");
		query.append(" 		alm.st_es_almacen_principal			as stEsAlmacenPrincipal, ");
		query.append(" 		alm.st_es_almacen_virtual			as stEsAlmacenVirtual ");
		
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo pa ");
		query.append(" 		on pa.id = pc.co_premio ");
		query.append(" inner join clpm_catalogo cat ");
		query.append(" 		on cat.id = pc.co_catalogo ");
		query.append(" inner join clpb_categoria ca ");
		query.append(" 		on ca.id = pa.co_categoria ");
		query.append(" inner join clpd_unidad_medida dm ");
		query.append(" 		on dm.id = pa.co_unidad_medida ");
		query.append(" inner join clpm_stock_almacen_catalogo sac ");
		query.append(" 		on  sac.co_premio = pc.id ");
		query.append(" 		and sac.co_catalogo = pc.co_catalogo ");
		query.append(" inner join clpb_almacen alm ");
		query.append(" 		on alm.id = sac.co_almacen ");
		
		query.append(" where pc.co_codigo_premio   = '").append(codePremio).append("'");
		query.append(" 		and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and alm.st_almacen		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		//validando catalogos vigentes
		query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
		query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		
		query.append(" group by ");
		query.append(" 		pc.va_stock_catalogo, ");
		query.append(" 		pc.va_stock_catalogo_espejo, ");	
		query.append(" 		pc.va_canjes_limite	, ");
		query.append(" 		pc.va_canjes_limite_espejo, ");
		query.append(" 		pa.va_stock_actual, ");
		query.append(" 		pa.va_stock_disponible, ");
		query.append(" 		pc.id, ");
		query.append(" 		pa.id, ");
		query.append(" 		pa.de_articulo, ");
		query.append(" 		pc.co_catalogo, ");
		query.append(" 		cat.de_catalogo	, ");
		query.append(" 		pc.co_codigo_premio, ");
		query.append(" 		pa.co_codigo_articulo, ");
		query.append(" 		ca.de_categoria	, ");
		query.append(" 		dm.de_unidad_medida, ");
		query.append(" 		pc.va_puntos_requeridos	, ");
		query.append(" 		pc.va_monto_requerido, ");
		query.append(" 		pa.st_maneja_serie	, ");
		query.append(" 		pa.st_maneja_stock_punto_canje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal, ");
		query.append(" 		pa.st_no_maneja_stock, ");
		query.append(" 		sac.id	, ");
		query.append(" 		sac.va_cantidad	, ");
		query.append(" 		sac.va_stock_catalogo, ");
		query.append(" 		sac.va_stock_catalogo_espejo, ");
		query.append(" 		sac.va_comprometido, ");
		query.append(" 		sac.co_almacen, ");
		query.append(" 		alm.st_es_almacen_principal, ");
		query.append(" 		alm.st_es_almacen_virtual ");
		
		System.out.println("**** CanjeDaoImpl.obtenerDatosPremioPorCodigo() --> "+query.toString());
		List<BNArticulo> list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){			
			for (BNArticulo bnarticulo2 : list) {					
				if(bnarticulo2.getStManejaStockAlmPrincipal().equals(CLPConstantes.ST_VERDADERO) &&
				   bnarticulo2.getStEsAlmacenPrincipal().equals(CLPConstantes.ST_VERDADERO)){						
					return bnarticulo2;					
				}else if(bnarticulo2.getStManejaStockPuntoCanje().equals(CLPConstantes.ST_VERDADERO) && 
						 bnarticulo2.getCoAlmacen().equals(coAlmacen)){
					return bnarticulo2;
				}else if(bnarticulo2.getStNoManejaStock().equals(CLPConstantes.ST_VERDADERO) &&
					bnarticulo2.getStEsAlmacenVirtual().equals(CLPConstantes.ST_VERDADERO)){
					return bnarticulo2;
				}
			}							
		}
		
		return new BNArticulo();
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerPremios(Long coalmacen, Long coCatalogo) {
		
		List list1 = obtenerPremiosPuntoCanje(coalmacen, coCatalogo);
		List list2 = obtenerPremiosPrincipalyVirtual(coCatalogo);

		list1.addAll(list2);
		return list1;
	}

	@SuppressWarnings("unchecked")
	private List<BNArticulo> obtenerPremiosPrincipalyVirtual(Long coCatalogo) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 		pa.de_articulo						as deArticulo, ");
		query.append(" 		cat.de_catalogo						as deCatalogo, ");
		query.append(" 		pc.co_codigo_premio					as coCodigoPremio, ");
		query.append(" 		pa.co_codigo_articulo				as coCodigoArticulo, ");
		query.append(" 		ca.de_categoria						as deCategoria, ");
		query.append(" 		dm.de_unidad_medida					as deUnidadMedida, ");
		query.append(" 		pc.va_puntos_requeridos				as vaPuntosRequeridos, ");
		query.append(" 		pc.va_monto_requerido				as vaMontoRequerido, ");
		query.append(" 		pa.st_maneja_serie					as stManejaSerie, ");
		query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
		query.append("   	pa.st_instantaneo_normal         	as stInstantaneoNormal, ");
		query.append("   	pa.st_instantaneo_vale          	as stInstantaneoVale, ");
		query.append(" 		pc.va_stock_catalogo_espejo			as vaStockCatalogo ");
		
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo pa ");
		query.append(" 		on pa.id = pc.co_premio ");
		query.append(" inner join clpm_catalogo cat ");
		query.append(" 		on cat.id = pc.co_catalogo ");
		query.append(" inner join clpb_categoria ca ");
		query.append(" 		on ca.id = pa.co_categoria ");
		query.append(" inner join clpd_unidad_medida dm ");
		query.append(" 		on dm.id = pa.co_unidad_medida ");
		query.append(" inner join clpm_stock_almacen_catalogo sac2 ");
		query.append(" 		on  sac2.co_premio 	 = pc.id ");
		query.append(" 		and sac2.co_articulo = pc.co_premio ");
		query.append(" 		and sac2.co_catalogo = pc.co_catalogo ");
		
		query.append(" where pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		
		if(coCatalogo != null)
		query.append(" 	and (pa.st_maneja_stock_punto_canje ='Y' or  pa.st_maneja_stock_alm_principal='Y' or  pa.st_no_maneja_stock='Y' ) ");
		query.append(" 	and pc.co_catalogo  = ").append(coCatalogo);
		query.append("	and pa.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_FALSO).append("'");	
		
		//validando catalogos vigentes
		query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
		query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		
		System.out.println("**** CanjeDaoImpl.obtenerPremios() --> "+query.toString());
		List list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){
			return list;
		}else{
			return new ArrayList<BNArticulo>();
		}
	}

	@SuppressWarnings("unchecked")
	private List<BNArticulo> obtenerPremiosPuntoCanje(Long coalmacen, Long coCatalogo) {

		StringBuffer query = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 		pa.de_articulo						as deArticulo, ");
		query.append(" 		cat.de_catalogo						as deCatalogo, ");
		query.append(" 		pc.co_codigo_premio					as coCodigoPremio, ");
		query.append(" 		pa.co_codigo_articulo				as coCodigoArticulo, ");
		query.append(" 		ca.de_categoria						as deCategoria, ");
		query.append(" 		dm.de_unidad_medida					as deUnidadMedida, ");
		query.append(" 		pc.va_puntos_requeridos				as vaPuntosRequeridos, ");
		query.append(" 		pc.va_monto_requerido				as vaMontoRequerido, ");
		query.append(" 		pa.st_maneja_serie					as stManejaSerie, ");
		query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
		query.append("   	pa.st_instantaneo_normal         	as stInstantaneoNormal, ");
		query.append("   	pa.st_instantaneo_vale          	as stInstantaneoVale, ");
		query.append(" 		sac2.va_cantidad					as vaStockCatalogoEstacion, ");
		query.append(" 		pc.va_stock_catalogo_espejo			as vaStockCatalogo ");
		
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo pa ");
		query.append(" 		on pa.id = pc.co_premio ");
		query.append(" inner join clpm_catalogo cat ");
		query.append(" 		on cat.id = pc.co_catalogo ");
		query.append(" inner join clpb_categoria ca ");
		query.append(" 		on ca.id = pa.co_categoria ");
		query.append(" inner join clpd_unidad_medida dm ");
		query.append(" 		on dm.id = pa.co_unidad_medida ");
		query.append(" inner join clpm_stock_almacen_catalogo sac2 ");
		query.append(" 		on  sac2.co_premio 	 = pc.id ");
		query.append(" 		and sac2.co_articulo = pc.co_premio ");
		query.append(" 		and sac2.co_catalogo = pc.co_catalogo ");		
		
		query.append(" where pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");		
		
		if(coCatalogo != null)
		query.append(" 	and (pa.st_maneja_stock_punto_canje ='Y' or  pa.st_maneja_stock_alm_principal='Y' or  pa.st_no_maneja_stock='Y' ) ");
		query.append(" 	and pc.co_catalogo  = ").append(coCatalogo);
		query.append(" 	and sac2.co_almacen = ").append(coalmacen);
		query.append("	and pa.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");	
		
		//validando catalogos vigentes
		query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
		query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		
		System.out.println("**** CanjeDaoImpl.obtenerPremios() --> "+query.toString());
		List list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){
			return list;
		}else{
			return new ArrayList<BNArticulo>();
		}
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerPremiosConFiltros(String coCatalogo,
			String coCategoria, String dePremio, String deCodigoPremio,
			String stManejaStock, String stManejaSerie, String coalmacen) {
		
		List list1 = obtenerPremiosPuntoCanjeConFiltros(coalmacen, coCatalogo,
		coCategoria,dePremio,deCodigoPremio,stManejaStock,stManejaSerie);
		
		List list2 = obtenerPremiosPrincipalyVirtualConFiltros(coCatalogo,
		coCategoria,dePremio,deCodigoPremio,stManejaStock,stManejaSerie);

		list1.addAll(list2);
		return list1;
	}

	@SuppressWarnings("unchecked")
	private List obtenerPremiosPrincipalyVirtualConFiltros(String coCatalogo,
			String coCategoria, String dePremio, String deCodigoPremio,
			String stManejaStock, String stManejaSerie) {

		if(stManejaStock.equalsIgnoreCase("-1") || 
		   stManejaStock.equalsIgnoreCase(CLPConstantes.ST_NO_MANEJA_STOCK) ||
		   stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
		
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 		pa.de_articulo						as deArticulo, ");
			query.append(" 		cat.de_catalogo						as deCatalogo, ");
			query.append(" 		pc.co_codigo_premio					as coCodigoPremio, ");
			query.append(" 		pa.co_codigo_articulo				as coCodigoArticulo, ");
			query.append(" 		ca.de_categoria						as deCategoria, ");
			query.append(" 		dm.de_unidad_medida					as deUnidadMedida, ");
			query.append(" 		pc.va_puntos_requeridos				as vaPuntosRequeridos, ");
			query.append(" 		pc.va_monto_requerido				as vaMontoRequerido, ");
			query.append(" 		pa.st_maneja_serie					as stManejaSerie, ");
			query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
			query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
			query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
			query.append(" 		pc.va_stock_catalogo_espejo			as vaStockCatalogo ");
			
			query.append(" from clpr_premio_catalogo pc ");
			query.append(" inner join clpd_articulo pa ");
			query.append(" 		on pa.id = pc.co_premio ");
			query.append(" inner join clpm_catalogo cat ");
			query.append(" 		on cat.id = pc.co_catalogo ");
			query.append(" inner join clpb_categoria ca ");
			query.append(" 		on ca.id = pa.co_categoria ");
			query.append(" inner join clpd_unidad_medida dm ");
			query.append(" 		on dm.id = pa.co_unidad_medida ");
			query.append(" inner join clpm_stock_almacen_catalogo sac2 ");
			query.append(" 		on  sac2.co_premio 	 = pc.id ");
			query.append(" 		and sac2.co_articulo = pc.co_premio ");
			query.append(" 		and sac2.co_catalogo = pc.co_catalogo ");
			
			query.append(" where 1 = 1 ");
			
			if(StringUtils.isNotBlank(stManejaStock) && !stManejaStock.equalsIgnoreCase("-1")){
				if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_NO_MANEJA_STOCK)){
					query.append("		and pa.st_no_maneja_stock = '").append(CLPConstantes.ST_VERDADERO).append("'");
				}
				else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
					query.append("		and pa.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
				}
			}else{				
				query.append("	and pa.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_FALSO).append("'");
			}
			
			if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase("-1")){
				query.append("	and pa.st_maneja_serie = '").append(stManejaSerie).append("'");			
			}
			
			if(StringUtils.isNotBlank(coCatalogo) && !coCatalogo.equalsIgnoreCase("-1")){
				query.append(" 		and pc.co_catalogo   = ").append(coCatalogo);
			}
			
			if(StringUtils.isNotBlank(coCategoria) && !coCategoria.equalsIgnoreCase("-1")){
				query.append(" 		and pa.co_categoria  = ").append(coCategoria);
			}
			
			if(StringUtils.isNotBlank(deCodigoPremio)){
				query.append(" 		and upper(pc.co_codigo_premio)  like upper('%").append(deCodigoPremio).append("%')");
			}
			
			if(StringUtils.isNotBlank(dePremio)){
				query.append(" 		and upper(pa.de_articulo) like upper('%").append(dePremio).append("%')");
			}				
			
			query.append(" 		and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			//validando catalogos vigentes
			query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
			query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
			
			System.out.println("**** CanjeDaoImpl.obtenerPremiosPrincipalyVirtualConFiltros() --> "+query.toString());
			
			List list = findListOfBeans(query.toString(), null, BNArticulo.class);
			if(!list.isEmpty()){
				return list;
			}else{
				return new ArrayList<BNArticulo>();
			}
		}else{
			return new ArrayList<BNArticulo>();
		}
	}

	@SuppressWarnings("unchecked")
	private List obtenerPremiosPuntoCanjeConFiltros(String coalmacen,
			String coCatalogo, String coCategoria, String dePremio,
			String deCodigoPremio, String stManejaStock, String stManejaSerie) {

		if(stManejaStock.equalsIgnoreCase("-1") || 
		   stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_PUNTO_CANJE)){
		
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 		pa.de_articulo						as deArticulo, ");
			query.append(" 		cat.de_catalogo						as deCatalogo, ");
			query.append(" 		pc.co_codigo_premio					as coCodigoPremio, ");
			query.append(" 		pa.co_codigo_articulo				as coCodigoArticulo, ");
			query.append(" 		ca.de_categoria						as deCategoria, ");
			query.append(" 		dm.de_unidad_medida					as deUnidadMedida, ");
			query.append(" 		pc.va_puntos_requeridos				as vaPuntosRequeridos, ");
			query.append(" 		pc.va_monto_requerido				as vaMontoRequerido, ");
			query.append(" 		pa.st_maneja_serie					as stManejaSerie, ");
			query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
			query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
			query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
			query.append(" 		sac2.va_cantidad					as vaStockCatalogoEstacion, ");
			query.append(" 		pc.va_stock_catalogo_espejo			as vaStockCatalogo ");
			
			query.append(" from clpr_premio_catalogo pc ");
			query.append(" inner join clpd_articulo pa ");
			query.append(" 		on pa.id = pc.co_premio ");
			query.append(" inner join clpm_catalogo cat ");
			query.append(" 		on cat.id = pc.co_catalogo ");
			query.append(" inner join clpb_categoria ca ");
			query.append(" 		on ca.id = pa.co_categoria ");
			query.append(" inner join clpd_unidad_medida dm ");
			query.append(" 		on dm.id = pa.co_unidad_medida ");
			query.append(" inner join clpm_stock_almacen_catalogo sac2 ");
			query.append(" 		on  sac2.co_premio 	 = pc.id ");
			query.append(" 		and sac2.co_articulo = pc.co_premio ");
			query.append(" 		and sac2.co_catalogo = pc.co_catalogo ");
			
			query.append(" where sac2.co_almacen = ").append(coalmacen);
			query.append("	and pa.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase("-1")){
				query.append("	and pa.st_maneja_serie = '").append(stManejaSerie).append("'");			
			}
			
			if(StringUtils.isNotBlank(coCatalogo) && !coCatalogo.equalsIgnoreCase("-1")){
				query.append(" 		and pc.co_catalogo   = ").append(coCatalogo);
			}
			
			if(StringUtils.isNotBlank(coCategoria) && !coCategoria.equalsIgnoreCase("-1")){
				query.append(" 		and pa.co_categoria  = ").append(coCategoria);
			}
			
			if(StringUtils.isNotBlank(deCodigoPremio)){
				query.append(" 		and upper(pc.co_codigo_premio)  like upper('%").append(deCodigoPremio).append("%')");
			}
			
			if(StringUtils.isNotBlank(dePremio)){
				query.append(" 		and upper(pa.de_articulo) like upper('%").append(dePremio).append("%')");
			}				
			
			query.append(" 		and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			//validando catalogos vigentes
			query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
            "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
			query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
            ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
			
			System.out.println("**** CanjeDaoImpl.obtenerPremiosPuntoCanjeConFiltros() --> "+query.toString());			
			List list = findListOfBeans(query.toString(), null, BNArticulo.class);
			if(!list.isEmpty()){
				return list;
			}else{
				return new ArrayList<BNArticulo>();
			}
		}else{
			return new ArrayList<BNArticulo>();
		}
	}

	@SuppressWarnings("unchecked")
	public synchronized Map guardarCanjePremio(BNDocumentoMovArticulo bndocumento) {

		String[] arrayStr = new String[4];
		Map map = new HashMap();
		//se inicia la transaccion para guardar todo el bloque

		try{
			
			String codTarjeta  	  = bndocumento.getCodTarjeta();
			String coAlmacen 	  = bndocumento.getCoAlmacen();
			String coCodigoPremio = bndocumento.getCoCodigoPremio();
			String strDirEntrega  = bndocumento.getStrDirEntrega();
			String coDepartamento = bndocumento.getCoDepartamento();
			String coProvincia    = bndocumento.getCoProvincia();
			String coDistrito     = bndocumento.getCoDistrito();
			Long vaCantidad 	  = bndocumento.getVaCantidad();
			Long vaPuntosPremio   = bndocumento.getVaPuntosPremio();
			Long vaPuntosTotales  = bndocumento.getVaPuntosTotales();
			BigDecimal vaPrecioPremio = bndocumento.getVaPrecioPremio();
			BigDecimal vaPrecioTotal  = bndocumento.getVaPrecioTotal();
			
			String stManejaSerie = bndocumento.getStManejaSerie();
			String stManejaStockPuntoCanje = bndocumento.getStManejaStockPuntoCanje();
			List<BNDocumentoDetalle> listDtl = bndocumento.getDocumentoDetalle();
			
			if(listDtl.isEmpty()){
				if(CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaSerie) &&
				   CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaStockPuntoCanje)){
					map.put("msg", "error");
					map.put("detalle", "listDocumentoDetalle");
					getHibernateTemplate().clear();
					return (HashMap)map;
				}
			}
			
			BNArticulo bnarticulo = obtenerDatosPremioPorCodigo(coCodigoPremio,coAlmacen);		
			if(StringUtils.isBlank(bnarticulo.getDeArticulo())){
				map.put("msg", "error");
				map.put("detalle", "coCodigoPremio");
				getHibernateTemplate().clear();
				return (HashMap)map;
			}
			
			BNClientesPersona beancliente = obtenerDatosClientePorTarjeta(codTarjeta);
			if(StringUtils.isBlank(beancliente.getDeNombre())){
				map.put("msg", "error");
				map.put("detalle", "codTarjeta");
				getHibernateTemplate().clear();
				return (HashMap)map;
			}
			
			///////////////////////////////////////////////////////////////////////
			bndocumento.setDeCliente(beancliente.getDeNombre());
			bndocumento.setDePuntosAcumulados(beancliente.getDePuntosAcumulados());
			///////////////////////////////////////////////////////////////////////
			
			if(Integer.parseInt(vaCantidad.toString()) > 
			   Integer.parseInt(bnarticulo.getVaStockCatalogo())){
				
				map.put("msg"	 , "error");
				map.put("detalle", "vaCantidad");
				map.put("flag"	 , bnarticulo.getVaStockCatalogo());
				getHibernateTemplate().clear();
				return (HashMap)map;
			}
			
			if(StringUtils.isNotBlank(beancliente.getDePuntosAcumulados())){				
				if(vaPuntosTotales > Integer.parseInt
				(beancliente.getDePuntosAcumulados())){
					map.put("msg"	 , "error");
					map.put("detalle", "dePuntosAcumulados");
					getHibernateTemplate().clear();
					return (HashMap)map;
				}				
			}else{
				map.put("msg"	 , "error");
				map.put("detalle", "dePuntosAcumulados");
				getHibernateTemplate().clear();
				return (HashMap)map;
			}
			
			ClpmUbigeo clpmUbigeo = null;		
			if(StringUtils.isNotBlank(coDepartamento) &&
			   StringUtils.isNotBlank(coProvincia) &&
			   StringUtils.isNotBlank(coDistrito)){
				
				clpmUbigeo = getUbigeo(coDepartamento,
				coProvincia, coDistrito);
				
				bndocumento.setDeDepartamento(clpmUbigeo.getDeDepartamento());
				bndocumento.setDeProvincia(clpmUbigeo.getDeProvincia());
				bndocumento.setDeDistrito(clpmUbigeo.getDeDistrito());
			}
			
			ClpbAlmacen clpbAlmacen = new ClpbAlmacen();
			clpbAlmacen.setId(new Long(coAlmacen));
			
			ClpdArticulo clpdArticulo = new ClpdArticulo();
			clpdArticulo.setId(new Long(bnarticulo.getCoArticulo()));
			
			ClprPremioCatalogo clprPremio = new ClprPremioCatalogo();
			clprPremio.setId(new Long(bnarticulo.getCoPremio()));
			
			ClpmCatalogo clpmCatalogo = new ClpmCatalogo();
			clpmCatalogo.setId(new Long(bnarticulo.getCoCatalogo()));
			
			ClpbClientePersona clpbClientePersona = new ClpbClientePersona();
			clpbClientePersona.setId(new Long(beancliente.getCoClientePersona()));
			
			String stTipoDocumento = "";
			if(CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaStockPuntoCanje)){
				stTipoDocumento = CLPConstantes.ST_DOCUMENTO_CANJE;
			}else{
				stTipoDocumento = CLPConstantes.ST_DOCUMENTO_RESERVA;
			}
			
			String nuSerie = bndocumento.getNuSerie();
			String nuDocumento = getNuDocumentoByCoAlmacenTipoDoc(coAlmacen, stTipoDocumento);
			bndocumento.setNuDocumento(nuDocumento);
			
			//BASE
			ClpbDocumentoMovArticulo objBean = new ClpbDocumentoMovArticulo();
			objBean.setDaFechaDocumento(Calendar.getInstance());
			objBean.setClpbAlmacen(clpbAlmacen);
			objBean.setClpmCatalogo(clpmCatalogo);
			objBean.setClpbClientePersona(clpbClientePersona);
			objBean.setDeObservaciones(bndocumento.getDeObservacion());
			objBean.setCoCodTarjetaPersonaCanje(bndocumento.getCodTarjeta());
			objBean.setNuSerie(bndocumento.getNuSerie());
			objBean.setNuDocumento(bndocumento.getNuDocumento());		
			objBean.setVaCantidad(new BigDecimal(vaCantidad));
			objBean.setVaPuntosPremio(new BigDecimal(vaPuntosPremio));
			objBean.setVaPuntosTotales(new BigDecimal(vaPuntosTotales));
			objBean.setVaPrecioPremio(vaPrecioPremio);		
			objBean.setVaPrecioTotal(vaPrecioTotal.setScale
			(CLPConstantes.CANTIDAD_DECIMALES, BigDecimal.ROUND_HALF_UP));
			
			objBean.setStDireccion(false);
			objBean.setStAlmacenPrincipal(false);
			objBean.setStPuntoCanje(false);
			
			if(("direccion").equalsIgnoreCase(strDirEntrega)){
				objBean.setStDireccion(true);
			}else if(("almacen").equalsIgnoreCase(strDirEntrega)){
				objBean.setStAlmacenPrincipal(true);
			}else if(("puntocanje").equalsIgnoreCase(strDirEntrega)){
				objBean.setStPuntoCanje(true);
			}
			
			objBean.setDeJrAvCa(bndocumento.getDeJrAvCa());
			objBean.setDeDireccion(bndocumento.getDeDireccion());
			objBean.setDeNumero(bndocumento.getDeNumero());
			objBean.setDeMzLote(bndocumento.getDeMzLote());
			objBean.setDeDptoPisoInt(bndocumento.getDeDptoPisoInt());
			objBean.setDeUrbIndResUnVec(bndocumento.getDeUrbIndResUnVec());
			objBean.setDeSecEtapaZona(bndocumento.getDeSecEtapaZona());
			objBean.setClpmUbigeo(clpmUbigeo);
			objBean.setClpdArticulo(clpdArticulo);
			objBean.setClprPremio(clprPremio);
			objBean.setStDocumentoMovArticulo(true);
			objBean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			objBean.setDaFechaCreacion(Calendar.getInstance());
			
			if(CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaStockPuntoCanje)){
				objBean.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_CANJE);
			}else{
				objBean.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_RESERVA);
			}			
			
			//guardando el registro base
			getHibernateTemplate().saveOrUpdate(objBean);

			//DETALLE
			for (int y = 0;y < vaCantidad; y++){
				
				ClpdDocumentoMovArticulo objBeanDetalle = new ClpdDocumentoMovArticulo();
				objBeanDetalle.setClpbDocumento(objBean);
				objBeanDetalle.setClpdArticulo(clpdArticulo);
				objBeanDetalle.setClprPremio(clprPremio);
				objBeanDetalle.setVaCantidad(BigDecimal.ONE);
				
				if(!listDtl.isEmpty()){
					BNDocumentoDetalle beandetalle = (BNDocumentoDetalle)listDtl.get(y);
					objBeanDetalle.setCoSerie(beandetalle.getCoSerie());
				}
				
				objBeanDetalle.setStDocumentoMovArticulo(true);
				objBeanDetalle.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				objBeanDetalle.setDaFechaCreacion(Calendar.getInstance());
				getHibernateTemplate().saveOrUpdate(objBeanDetalle);
				
				////////////////////////////////////////////////////////////////////////
				
				ClpmTransaccionArticulo clpmTransaccion = new ClpmTransaccionArticulo();
				clpmTransaccion.setClpdArticulo(clpdArticulo);
				clpmTransaccion.setCoCodigoArticulo(bnarticulo.getCoCodigoArticulo());
				
				if(CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaStockPuntoCanje)){
					clpmTransaccion.setStIndicadorTipoMovimiento(CLPConstantes.CANJE_DE_PREMIO);
				}else{
					clpmTransaccion.setStIndicadorTipoMovimiento(CLPConstantes.PREMIO_COMPROMETIDO_POR_CANJE);
				}					
				
				clpmTransaccion.setVaCantidad(BigDecimal.ONE.negate());
				clpmTransaccion.setClpbAlmacen(clpbAlmacen);
				clpmTransaccion.setClpmCatalogo(clpmCatalogo);
				clpmTransaccion.setClprPremio(clprPremio);
				clpmTransaccion.setCoCodigoPremio(coCodigoPremio);
				clpmTransaccion.setClpbDocumentoMovArticulo(objBean);
				
				if(!listDtl.isEmpty()){
					BNDocumentoDetalle beandetalle = (BNDocumentoDetalle)listDtl.get(y);
					clpmTransaccion.setCoSerie(beandetalle.getCoSerie());
				}
				
				clpmTransaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				clpmTransaccion.setDaFechaCreacion(Calendar.getInstance());
				getHibernateTemplate().saveOrUpdate(clpmTransaccion);
			}
			
			
			//UPDATES
			StringBuffer query = new StringBuffer();
			query.append(" update clpd_articulo ");
			query.append(" set ");
			query.append(" 		va_stock_actual = decode(va_stock_actual,null,"+(-vaCantidad)+",va_stock_actual - "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 		da_fecha_modificacion  = sysdate");
			query.append(" where id = ").append(bnarticulo.getCoArticulo());
			
			arrayStr[0] = query.toString();

			query = new StringBuffer();
			query.append(" update clpr_premio_catalogo ");
			query.append(" set ");
			query.append(" 		va_canjes_limite_espejo  = decode(va_canjes_limite_espejo,null,"+(-vaCantidad)+",va_canjes_limite_espejo - "+vaCantidad+"),");
			query.append(" 		va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,"+(-vaCantidad)+",va_stock_catalogo_espejo - "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 		da_fecha_modificacion  = sysdate");
			query.append(" where id = ").append(bnarticulo.getCoPremio());
			arrayStr[1] = query.toString();
			
			long vaPuntos = Integer.parseInt(beancliente.getDePuntosAcumulados()) - vaPuntosTotales;
			
			query = new StringBuffer();
			query.append(" update clpm_puntos_periodo_cliente ");
			query.append(" set ");
			query.append(" 		va_puntos_actuales = va_puntos_actuales - ").append(vaPuntosTotales).append(",");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 		da_fecha_modificacion  = sysdate");
			query.append(" where co_cliente_persona = ").append(beancliente.getCoClientePersona());
			arrayStr[2] = query.toString();
			
			
			long coStockAlmacenCat   = Integer.parseInt(bnarticulo.getCoStockAlmacenCatalogo());
			
			query = new StringBuffer();
			query.append(" update clpm_stock_almacen_catalogo ");
			query.append(" set ");
			
			if(CLPConstantes.ST_FALSO.equalsIgnoreCase(stManejaStockPuntoCanje))
			query.append(" 		va_comprometido = decode(va_comprometido,null,"+vaCantidad+",va_comprometido + "+vaCantidad+"),");			
			query.append(" 		va_cantidad = decode(va_cantidad,null,"+(-vaCantidad)+",va_cantidad - "+vaCantidad+"),");
			query.append(" 		va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,"+(-vaCantidad)+",va_stock_catalogo_espejo - "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 		da_fecha_modificacion  = sysdate");
			query.append(" where id = ").append(coStockAlmacenCat);
			arrayStr[3] = query.toString();
			
			///////////////////////////////
			///////////////////////////////
			
			/**********************************/
			getHibernateTemplate().flush();
			
			//actualizando el indice del nuDocumento en la tabla clpm_serie_canje
			updateNuDocumentoByCoAlmacenTipoDoc(coAlmacen, stTipoDocumento, 
			nuSerie, nuDocumento);
			
			/**********************************/
			
			jdbcTemplate.batchUpdate(arrayStr);
			
			for (int i = 0; i < arrayStr.length; i++) {
				System.out.println(i+"* update detalle guardarCanjePremio(): "+arrayStr[i]);
			}
			
			map.put("msg", "success");
			map.put("id" , objBean.getId());
			///////////////////////////////
			///////////////////////////////
			
			bndocumento.setId(objBean.getId());
			bndocumento.setDePuntosAcumulados(String.valueOf(vaPuntos));			
			if(CLPConstantes.ST_VERDADERO.equalsIgnoreCase(stManejaStockPuntoCanje)){
				bndocumento.setStOperacion(CLPConstantes.ST_DOCUMENTO_CANJE);
			}else{
				bndocumento.setStOperacion(CLPConstantes.ST_DOCUMENTO_RESERVA);
			}
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			map.put("msg", "error");
			log.info(e.getMessage());
		}
		
		return (HashMap)map;
	}

	@SuppressWarnings("unchecked")
	public ClpmUbigeo getUbigeo(String coDepartamento, String coProvincia,
			String coDistrito) {

		DetachedCriteria criteria = DetachedCriteria.forClass(ClpmUbigeo.class);
			
		criteria.add(Restrictions.eq("coDepartamento", new Integer(coDepartamento)));
		criteria.add(Restrictions.eq("coProvincia"	 , new Integer(coProvincia)));
		criteria.add(Restrictions.eq("coDistrito"	 , new Integer(coDistrito)));
		criteria.add(Restrictions.eq("stUbigeo"		 , Boolean.TRUE));
	
		List<ClpmUbigeo> lista = getHibernateTemplate().findByCriteria(criteria);
		if(!lista.isEmpty()){
			return (ClpmUbigeo)lista.get(0);
		}else{
			return null;
		}
		
	}

	@SuppressWarnings("unchecked")
	public void obtenerListasDatosUbigeo(Model model,
			BNDocumentoMovArticulo bnCanje, AfiliacionDao afiliacionDao) {

		String coDepartamento = "";
		String coProvincia 	  = "";		
		
		List listDep  = null;
		List listProv = null;
		List listDist = null;
		
		if(ValidationUtil.isValidateString(bnCanje.getCoDepartamento())){
			
			listDep  = afiliacionDao.findDepartamentosUbigeo(false);				
			listProv = afiliacionDao.findPronvinciaUbigeo(bnCanje.getCoDepartamento(),false);				
			listDist = afiliacionDao.findDistritoUbigeo(bnCanje.getCoDepartamento(),bnCanje.getCoProvincia(),false);
		
		}else{
		
			listDep = afiliacionDao.findDepartamentosUbigeo(false);		
			for (int i = 0; i < listDep.size(); i++) {					
				ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
				if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
					coDepartamento = dep.getCoDepartamento().toString();
					break;
				}
			}
			
			if("".equals(coDepartamento)){
				ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
				coDepartamento = dep.getCoDepartamento().toString();
			}
			
			listProv = afiliacionDao.findPronvinciaUbigeo(coDepartamento, false);
			for (int i = 0; i < listProv.size(); i++) {					
				ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
				if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
					coProvincia = prov.getCoProvincia().toString();
					break;
				}
			}
			
			if("".equals(coProvincia)){
				ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
				coProvincia = prov.getCoProvincia().toString();
			}
			
			bnCanje.setCoDepartamento(coDepartamento);
			bnCanje.setCoProvincia(coProvincia);
			listDist = afiliacionDao.findDistritoUbigeo(coDepartamento,coProvincia, false);
		
		}
		
		model.addAttribute("listadepartamento" , listDep);
		model.addAttribute("listaprovincia"	   , listProv);
		model.addAttribute("listadistrito"	   , listDist);
	}

	@SuppressWarnings("unchecked")
	public Map canjearReserva(BNDocumentoMovArticulo bndocumento) {

		Map map = new HashMap();
		List<BNDocumentoDetalle> listDtl = bndocumento.getDocumentoDetalle();
		//se inicia la transaccion para guardar todo el bloque

		try{
		
			//frk: evaluando si la reserva ingreso stock
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	count(*) ");
			query.append(" from clpm_reserva_mov_stock ");
			query.append(" where co_documento_mov_articulo = ").append(bndocumento.getId());
			query.append(" and st_reserva_mov_stock = '"+CLPConstantes.ST_VERDADERO+"'");			
			
			int countIngreso = jdbcTemplate.queryForInt(query.toString());
			if(countIngreso == 0){
				map.put("msg", "error");
				map.put("dtl", "No se proceso, no se ingreso stock para esta reserva.");
				return map;
			}
			
			Long vaCantidad  = bndocumento.getVaCantidad();
			String coAlmacen = bndocumento.getCoAlmacen();
			String coCodigoPremio = bndocumento.getCoCodigoPremio();
			BNArticulo bnarticulo = obtenerDatosPremioPorCodigo(coCodigoPremio,coAlmacen);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	id as coDetail");
			query.append(" from clpd_documento_mov_articulo ");
			query.append(" where co_documento_mov_articulo = ").append(bndocumento.getId());			
			List listDetail = jdbcTemplate.queryForList(query.toString());
			if(!ValidationUtil.validateList(listDetail))
			listDetail = new ArrayList();
			
			String[] arrayStr = new String[(listDetail.size()*2)+2];
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	id as coTransac ");
			query.append(" from clpm_transaccion_articulo ");
			query.append(" where co_documento_mov_articulo = ").append(bndocumento.getId());			
			List listTransac = jdbcTemplate.queryForList(query.toString());
			
			//DETALLE
			int indice = 0;
			if(!listDtl.isEmpty()){
				for (int y = 0;y < listDetail.size(); y++){
					
					///////////////////////////////////
					BNDocumentoDetalle beandetalle = 
					(BNDocumentoDetalle)listDtl.get(y);
					///////////////////////////////////
					
					Map objMap = (HashMap)listDetail.get(y);
					String coDetail = String.valueOf(objMap.get("coDetail"));
					
					query = new StringBuffer();
					query.append(" update clpd_documento_mov_articulo ");
					query.append(" set ");					
					query.append(" 	co_serie = '").append(beandetalle.getCoSerie()).append("',");
					query.append(" 	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
					query.append(" 	da_fecha_modificacion  = sysdate");
					query.append(" where id = ").append(coDetail);
					query.append(" 	and co_documento_mov_articulo = ").append(bndocumento.getId());				
					
					arrayStr[indice] = query.toString();
					indice++;
					
					///////////////////////////////////////////////////////////////////
					///////////////////////////////////////////////////////////////////
					
					Map objMapTransac = (HashMap)listTransac.get(y);
					String coTransac  = String.valueOf(objMapTransac.get("coTransac"));
					
					query = new StringBuffer();
					query.append(" update clpm_transaccion_articulo ");
					query.append(" set ");					
					query.append(" 	co_serie = '").append(beandetalle.getCoSerie()).append("',");
					query.append(" 	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
					query.append(" 	da_fecha_modificacion  = sysdate");
					query.append(" where id = ").append(coTransac);
					query.append(" 	and co_documento_mov_articulo = ").append(bndocumento.getId());				
					
					arrayStr[indice] = query.toString();
					indice++;
				}
			}
			
			//BASE
			query = new StringBuffer();
			query.append(" update clpb_documento_mov_articulo ");
			query.append(" set ");
			query.append(" 	nu_doc_entrega_reserva = '").append(bndocumento.getNuDocEntregaReserva()).append("',");
			query.append(" 	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 	da_fecha_modificacion  = sysdate");
			query.append(" where id = ").append(bndocumento.getId());
			
			arrayStr[indice] = query.toString();
			indice++;
			
			long coStockAlmacenCat = Integer.parseInt(bnarticulo.getCoStockAlmacenCatalogo());
			
			//DESCUENTO EL COMPROMETIDO
			query = new StringBuffer();
			query.append(" update clpm_stock_almacen_catalogo ");
			query.append(" set ");
			query.append(" 	va_comprometido = decode(va_comprometido,null,"+(-vaCantidad)+",va_comprometido - "+vaCantidad+"),");
			query.append(" 	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append(" 	da_fecha_modificacion  = sysdate");
			query.append(" where id = ").append(coStockAlmacenCat);
			arrayStr[indice] = query.toString();
			
			///////////////////////////////
			///////////////////////////////
			getHibernateTemplate().flush();
			jdbcTemplate.batchUpdate(arrayStr);
			
			for (int i = 0; i < arrayStr.length; i++) {
				System.out.println(i+"* update detalle canjearReserva(): "+arrayStr[i]);
			}
			
			map.put("msg", "success");
			///////////////////////////////
			///////////////////////////////
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			map.put("msg", "error");
			log.info(e.getMessage());
		}
		
		return (HashMap)map;
	}

	@SuppressWarnings("unchecked")
	public List<ClpmSerieCanje> obtenerListaSerieCanjePorEstacionTipoDocumento(
		String codeEstacion, String stTipoDoc) {

		ClpmSerieCanje bean = new ClpmSerieCanje();
		bean.setCoSerie("-1");
		bean.setDeSerie("----");
		
		List listFinal = new ArrayList();
		listFinal.add(bean);
		
		if(!"-2".equals(codeEstacion) && !"-2".equals(stTipoDoc)){
		
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	de_serie as coSerie, ");
			query.append(" 	de_serie as deSerie ");
			query.append(" from clpm_serie_canje ");
			query.append(" where st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			if(StringUtils.isNotBlank(codeEstacion) && !"-1".equals(codeEstacion))
			query.append(" and co_estacion = ").append(codeEstacion);
			
			if(StringUtils.isNotBlank(stTipoDoc) && !"-1".equals(stTipoDoc))
			query.append(" and st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			
			query.append(" order by de_serie asc ");
			System.out.println("seriesxEstacionxtipoDocumento:"+query.toString());
			List list = findListOfBeans(query.toString(), null, ClpmSerieCanje.class);
			
			if(ValidationUtil.validateList(list) && list.size() == 1){
				return list;
			}
			
			listFinal.addAll(list);
		}
		
		return listFinal;
	}

	@SuppressWarnings("unchecked")
	public List<ClpmSerieCanje> obtenerListaSerieCanjePorAlmacenTipoDocumento(
			String coAlmacen, String stTipoDoc) {

		ClpmSerieCanje bean = new ClpmSerieCanje();
		bean.setCoSerie("-1");
		bean.setDeSerie("----");
		
		List listFinal = new ArrayList();
		listFinal.add(bean);
		
		if(!"-2".equals(coAlmacen) && !"-1".equals(coAlmacen) && StringUtils.isNotBlank(coAlmacen) &&
		   !"-2".equals(stTipoDoc) && !"-1".equals(stTipoDoc) && StringUtils.isNotBlank(stTipoDoc)){
		
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	scj.de_serie as coSerie, ");
			query.append(" 	scj.de_serie as deSerie ");
			query.append(" from clpm_serie_canje scj ");
			query.append(" join clpb_almacen alm ");
			query.append(" on alm.co_estacion = scj.co_estacion ");
			query.append(" where scj.st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and alm.id = ").append(coAlmacen);
			query.append(" and scj.st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			
			query.append(" order by de_serie asc ");
			List list = findListOfBeans(query.toString(), null, ClpmSerieCanje.class);
			
			if(ValidationUtil.validateList(list) && list.size() == 1){
				return list;
			}
			
			listFinal.addAll(list);
		}
		
		return listFinal;
	}
	
	@SuppressWarnings("unchecked")
	private String getNuDocumentoByCoAlmacenTipoDoc(String coAlmacen,
			String stTipoDoc) {

		String result = "";
		if(!"-2".equals(coAlmacen) && !"-1".equals(coAlmacen) && StringUtils.isNotBlank(coAlmacen) &&
		   !"-2".equals(stTipoDoc) && !"-1".equals(stTipoDoc) && StringUtils.isNotBlank(stTipoDoc)){
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	max(co_documento) as co_documento ");
			query.append(" from clpm_serie_canje scj ");
			query.append(" join clpb_almacen alm ");
			query.append(" on alm.co_estacion = scj.co_estacion ");
			query.append(" where scj.st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and alm.id = ").append(coAlmacen);
			query.append(" and scj.st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			
			List list = jdbcTemplate.queryForList(query.toString());
			if(ValidationUtil.validateList(list)){
				
				Map objMap = (HashMap)list.get(0);
				String nuDocumento = String.valueOf(objMap.get("co_documento"));
				
				if(nuDocumento.equals("") || nuDocumento.equals("null")){
					result = "1";
				}else{
					result = String.valueOf(Long.parseLong(nuDocumento) + 1);
				}
			}			
		}
		
		return result;
	}
	
	private void updateNuDocumentoByCoAlmacenTipoDoc(String coAlmacen,
			String stTipoDoc, String nuSerie, String nuDocumento) {

		String coEstacion = obtenerCodigoEstacionPorAlmacen(coAlmacen);
		if(StringUtils.isNotBlank(nuDocumento) && StringUtils.isNotBlank(nuSerie) && 
		   StringUtils.isNotBlank(coEstacion)){		
			
			StringBuffer query = new StringBuffer();
			query.append(" update clpm_serie_canje ");
			query.append(" 	set co_documento = ").append(nuDocumento);
			query.append(" where st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			query.append(" and co_estacion = ").append(coEstacion);
			query.append(" and de_serie = '").append(nuSerie.trim()).append("'");			
			
			jdbcTemplate.update(query.toString());
		}	
	}
	
	@SuppressWarnings("unchecked")
	private String obtenerCodigoEstacionPorAlmacen(String codeAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select co_estacion ");
		query.append(" from clpb_almacen ");
		query.append(" where id = ").append(codeAlmacen);
		query.append(" and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("co_estacion"));
		}else{
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public BNDocumentoMovArticulo obtenerCanjesInstantaneo(String id,
			String codCanje) {
		
		
		StringBuffer query=new StringBuffer();
		List<BNDocumentoMovArticulo> lista=null;
		
		query.append(" SELECT ");
		query.append("  solicanjeins.id                                		 AS solCanjeInsid , ");
		query.append("  solicanjeins.co_code_canje                           AS codCanje , ");
		query.append("  almacen.de_almacen                                   AS deAlmacen , ");
		query.append("  estacion.de_estacion                                 AS deEstacion , ");
		query.append("  articulo.de_articulo                                 AS deCodigoPremio , ");
		query.append("  premio.co_codigo_premio                              as coCodigoPremio, ");
		query.append("  articulo.st_no_maneja_stock                          AS stNoManejaStock , ");
		query.append("  articulo.st_maneja_stock_punto_canje                 AS stManejaStockPuntoCanje , ");
		query.append("  articulo.st_maneja_stock_alm_principal               AS stManejaStockAlmPrincipal , ");
		query.append("  articulo.st_instantaneo_normal                       AS stInstantaneoNormal , ");
		query.append("  articulo.st_instantaneo_vale                         AS stInstantaneoVale , ");
		query.append(" 	catalogo.de_catalogo                                 AS deCatalogo , ");
		query.append("  solicanjeins.co_code_tarjeta_persona                 AS codTarjeta , ");
		query.append(" 	TO_CHAR(solicanjeins.da_fecha_creacion,'dd/MM/yyyy') AS daFechaCanje , ");
		query.append("  'CI'                                                 AS stindicatortipodoc , ");
		query.append("  premio.co_premio_instantaneo                         AS codpremioinst , ");
		query.append("  solicanjeins.st_solic_canje_instantaneo              AS stSolicitudCanje , ");
		query.append("  DECODE(solicanjeins.co_proceso_ok,'1','Y','N')       AS stProcesoOK , ");
		query.append("  solicanjeins.de_mensaje                              as deObservacion, ");
		query.append("  solicanjeins.co_code_cara                            as coCodeCara, ");
		query.append("  solicanjeins.st_premio_vale                          as stPremiovale, ");
		query.append("  solicanjeins.st_confirmado_regularizacion            as stConfirmadoRegularizacion, ");
		query.append("  solicanjeins.st_confirmado_proceso                   as stConfirmadoProceso, ");
		query.append(" 	solicanjeins.co_venta                              	 as coVenta, ");
		query.append("  solicanjeins.co_periodo_acumulacion                  as coPeriodoAcumulacion, ");
		query.append(" 	solicanjeins.va_precio_referencial                   as	vaPrecioReferencial, ");
		query.append("  solicanjeins.va_puntos                               as vaPuntosPremio,  ");
		query.append("  solicanjeins.va_puntos_totales                       as vapuntostotales,  ");
		query.append("  solicanjeins.va_precio_referencial                   as vapreciopremio,  ");
		query.append("  solicanjeins.va_precio_total_pagar                   AS vaPrecioTotal,  ");		
		query.append(" 	solicanjeins.va_efectivo                             as vaEfectivo, ");
		query.append("  solicanjeins.va_cantidad                             as vaCantidad, ");
		query.append(" 	(cliente.de_nombre  ||' ' || cliente.de_ape_paterno ||' '||cliente.de_ape_materno)  as deCliente ");
		query.append(" 	FROM clpm_solic_canje_instantaneo solicanjeins ");
		query.append(" 	LEFT JOIN clpb_cliente_persona cliente  ");
		query.append(" 	ON cliente.id = solicanjeins.co_cliente_persona  ");
		query.append(" 	INNER JOIN clpb_estacion estacion  ");
		query.append(" 	ON estacion.co_codigo_cofide= solicanjeins.co_code_estacion  ");
		query.append(" 	INNER JOIN clpb_almacen almacen  ");
		query.append(" 	ON almacen.co_estacion = estacion.id  ");
		query.append(" 	LEFT JOIN clpr_premio_catalogo premio  ");
		query.append(" 	ON premio.id=solicanjeins.co_premio  "); 
		query.append(" 	LEFT JOIN clpd_articulo articulo  ");
		query.append(" 	ON articulo.id=premio.co_premio  ");
		query.append(" 	LEFT JOIN clpm_catalogo catalogo ");
		query.append(" 	ON catalogo.id                               = premio.co_catalogo  ");
//		query.append("  WHERE solicanjeins.st_solic_canje_instantaneo='Y' ");
		query.append(" 	WHERE solicanjeins.id=").append(id);
		query.append(" 		and solicanjeins.co_code_canje=").append(codCanje);
		
		System.out.println(query.toString());
		BNDocumentoMovArticulo bean =new BNDocumentoMovArticulo();
		lista=findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
		if(!lista.isEmpty()){
			bean.setDeCliente(lista.get(0).getDeCliente());
			bean.setSolCanjeInsid(lista.get(0).getSolCanjeInsid());
			bean.setCodCanje(lista.get(0).getCodCanje());
			bean.setDeAlmacen(lista.get(0).getDeAlmacen());
			bean.setDeEstacion(lista.get(0).getDeEstacion());
			bean.setStNoManejaStock(lista.get(0).getStNoManejaStock());
			bean.setStManejaStockPuntoCanje(lista.get(0).getStManejaStockPuntoCanje());
			bean.setStManejaStockAlmPrincipal(lista.get(0).getStManejaStockAlmPrincipal());
			bean.setStInstantaneoNormal(lista.get(0).getStInstantaneoNormal());
			bean.setStInstantaneoVale(lista.get(0).getStInstantaneoVale());
			bean.setDeCatalogo(lista.get(0).getDeCatalogo());
			bean.setCodTarjeta(lista.get(0).getCodTarjeta());
			bean.setDaFechaCanje(lista.get(0).getDaFechaCanje());
			bean.setStIndicatorTipoDoc(lista.get(0).getStIndicatorTipoDoc());
			bean.setCodPremioinst(lista.get(0).getCodPremioinst());
			bean.setStSolicitudCanje(lista.get(0).getStSolicitudCanje());
			bean.setStProcesoOK(lista.get(0).getStProcesoOK());
			bean.setDeMensaje(lista.get(0).getDeMensaje());
			bean.setCoCodeCara(lista.get(0).getCoCodeCara());
			bean.setStPremiovale(lista.get(0).getStPremiovale());
		
			bean.setCoVenta(lista.get(0).getCoVenta());
			bean.setCoPeriodoAcumulacion(lista.get(0).getCoPeriodoAcumulacion());
			bean.setVaPrecioReferencial(lista.get(0).getVaPrecioReferencial());
			
			bean.setVaPuntosPremio(lista.get(0).getVaPuntosPremio());
			bean.setVaPuntosTotales(lista.get(0).getVaPuntosTotales());
			bean.setVaPrecioPremio(lista.get(0).getVaPrecioPremio());
			bean.setVaPrecioTotal(lista.get(0).getVaPrecioTotal());
			
			bean.setVaEfectivo(lista.get(0).getVaEfectivo());
			bean.setDaFechaDocumento(lista.get(0).getDaFechaCanje());
			bean.setCoCodigoPremio(lista.get(0).getCoCodigoPremio());
			bean.setDeCodigoPremio(lista.get(0).getDeCodigoPremio());
			bean.setVaCantidad(lista.get(0).getVaCantidad());
			bean.setDeObservacion(lista.get(0).getDeObservacion());
			bean.setStCanje(lista.get(0).getStProcesoOK());
			
			if(lista.get(0).getStConfirmadoProceso().equals(CLPConstantes.ST_VERDADERO)){
				bean.setStConfirmadoProceso(CLPConstantes.FLAG_YES);
				
			}else{
				bean.setStConfirmadoProceso(CLPConstantes.FLAG_NO);
			}
			
			if(lista.get(0).getStConfirmadoRegularizacion().equals(CLPConstantes.ST_VERDADERO)){
				bean.setStConfirmadoRegularizacion(CLPConstantes.FLAG_YES);
				
			}else{
				bean.setStConfirmadoRegularizacion(CLPConstantes.FLAG_NO);
			}
			
		
			
		}
		return bean;

	}
}
